package com.davidlife.javase.datatype;

import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;

import java.io.*;

/*
### 字节与字符之间的转换
* 比如，若硬盘中文本文件是以GBK格式存储的，则Java程序中就应用相对应的编解码格式（GBK）来读取文件，这样才能将硬盘中存储的实际为二进制的文本文件解码为正确的字符；否则若采用不对应的编码方式读取，就会出现乱码。
    + 比如在中文Windows系统中新建一个文本文件，写入中文，这时你用Idea打开这个文件就会显示乱码，因为Idea一般默认用的UTF-8编码。而当你用FileReader类读取这个文件内容时，也会读出乱码，因为它其实就是继承自InputStreamReader，但是没有指定charset，所以用的是Idea默认的UTF-8编码读取的文件，就会出现乱码。
    + 要想用指定的编解码方式读取\写入文件，可以用转换流“InputStreamReader/OutputStreamWriter”指定对应的charset来正确读取\写入文本文件。
 */
public class CharacterEncoding {
    public static void main(String[] args) throws Exception {
        writeGbk();
        readeGbk();
        System.out.println("======================");
        gbkToUtf8();
    }


    //以GBK编码方式写入内容到文件
    //在IDE中，若不指定charset，则默认的为UTF-8
    private static void writeGbk() throws Exception {
        FileOutputStream fos = new FileOutputStream("gbk.txt");
        OutputStreamWriter osw = new OutputStreamWriter(fos, "GBK");
        osw.write("你好");
        osw.flush();
        osw.close();
    }

    //读取以GBK编码方式存储的文件
    private static void readeGbk() throws Exception {
        /*FileInputStream fis = new FileInputStream("gbk.txt");
        InputStreamReader isr = new InputStreamReader(fis, "GBK");
        BufferedReader br = new BufferedReader(isr);
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
        }
        br.close();*/
        InputStreamReader isr = new InputStreamReader(new FileInputStream("gbk.txt"), "GBK");
        int c = 0;
        while ((c = isr.read()) != -1) {
            System.out.println((char) c);
        }
        isr.close();
    }

    //把GBK编码格式的文件转换为UTF-8编码格式的文件
    private static void gbkToUtf8() throws IOException {
        InputStreamReader isr = new InputStreamReader(new FileInputStream("gbk.txt"), "GBK");
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("utf8.txt"), "UTF-8");
        BufferedReader br = new BufferedReader(isr);
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
            osw.write(line);
        }
        osw.flush();
        osw.close();
        br.close();
    }
}
